<?php
declare (strict_types = 1);

namespace app\model;

use think\Model;
use think\facade\Db;

/**
 * @mixin \think\Model
 */
class User extends Model
{
    /**
     * 检查IP注册限制
     * @param string $ip IP地址
     * @param int $maxAttempts 最大尝试次数
     * @param int $timePeriod 时间周期（秒）
     * @return bool 是否允许注册
     */
    public static function checkRegisterLimit(string $ip, int $maxAttempts = 3, int $timePeriod = 3600): bool
    {
        $count = Db::table('ip_restrictions')
            ->where('ip', $ip)
            ->where('action', 'register')
            ->where('created_at', '>', date('Y-m-d H:i:s', time() - $timePeriod))
            ->sum('attempts');

        return $count < $maxAttempts;
    }

    /**
     * 记录注册尝试
     * @param string $ip IP地址
     */
    public static function logRegisterAttempt(string $ip): void
    {
        $exists = Db::table('ip_restrictions')
            ->where('ip', $ip)
            ->where('action', 'register')
            ->where('created_at', '>', date('Y-m-d H:i:s', time() - 3600))
            ->find();

        if ($exists) {
            Db::table('ip_restrictions')
                ->where('id', $exists['id'])
                ->inc('attempts')
                ->update(['updated_at' => date('Y-m-d H:i:s')]);
        } else {
            Db::table('ip_restrictions')->insert([
                'ip' => $ip,
                'action' => 'register',
                'attempts' => 1,
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s'),
                'expires_at' => date('Y-m-d H:i:s', time() + 3600)
            ]);
        }
    }

    /**
     * 检查登录尝试限制
     * @param string $ip IP地址
     * @param int $maxAttempts 最大尝试次数
     * @return bool 是否允许登录
     */
    public static function checkLoginLimit(string $ip, int $maxAttempts = 5): bool
    {
        $count = Db::table('ip_restrictions')
            ->where('ip', $ip)
            ->where('action', 'login')
            ->where('created_at', '>', date('Y-m-d H:i:s', time() - 3600))
            ->sum('attempts');

        return $count < $maxAttempts;
    }

    /**
     * 记录登录尝试失败
     * @param string $ip IP地址
     */
    public static function logFailedLoginAttempt(string $ip): void
    {
        $exists = Db::table('ip_restrictions')
            ->where('ip', $ip)
            ->where('action', 'login')
            ->where('created_at', '>', date('Y-m-d H:i:s', time() - 3600))
            ->find();

        if ($exists) {
            Db::table('ip_restrictions')
                ->where('id', $exists['id'])
                ->inc('attempts')
                ->update(['updated_at' => date('Y-m-d H:i:s')]);
        } else {
            Db::table('ip_restrictions')->insert([
                'ip' => $ip,
                'action' => 'login',
                'attempts' => 1,
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s'),
                'expires_at' => date('Y-m-d H:i:s', time() + 3600)
            ]);
        }
    }

    /**
     * 清除过期的限制记录
     */
    public static function clearExpiredLimits(): void
    {
        Db::table('ip_restrictions')
            ->where('expires_at', '<', date('Y-m-d H:i:s'))
            ->delete();
    }
}